package br.gov.capgov.treinamento.web.batch;

import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.Asynchronous;
import javax.ejb.EJB;
import javax.ejb.Schedule;
import javax.ejb.Singleton;
import javax.ejb.Startup;

import br.gov.capgov.treinamento.ejb.sessionbeans.ControleDeQuedasEJB;
import br.gov.capgov.treinamento.ejb.sessionbeans.InfoUrlEJB;
import br.gov.capgov.treinamento.ejb.sessionbeans.SistemaEJB;
import br.gov.capgov.treinamento.ejb.sessionbeans.UrlEJB;
import br.gov.capgov.treinamento.jpa.entidades.ControleDeQuedas;
import br.gov.capgov.treinamento.jpa.entidades.InfoUrl;
import br.gov.capgov.treinamento.jpa.entidades.Sistema;
import br.gov.capgov.treinamento.jpa.entidades.Url;

@Singleton
@Startup
public class ControleDeUrls
{
	@EJB 
	private SistemaEJB sistemaEJB = new SistemaEJB();
	@EJB
	private UrlEJB urlEJB = new UrlEJB();
	@EJB
	private InfoUrlEJB infoUrlEJB = new InfoUrlEJB();
	@EJB
	private ControleDeQuedasEJB controleDeQuedasEJB = new ControleDeQuedasEJB();
	
	private InfoUrl infoUrl = new InfoUrl();
	private ControleDeQuedas controleDeQuedas = new ControleDeQuedas();
	private int cont = 0;
	
	public ControleDeUrls()
	{
		
	}
	
	public boolean isOnline(String strurl) throws IOException
	{
		URL url1 = new URL(strurl);
		infoUrl.setDataHora(new Date());
		long time_inicial = infoUrl.getDataHora().getTime();
		
		URLConnection connection =  url1.openConnection();
		
		String status = connection.getHeaderField(null);
		String header = connection.getHeaderFields().toString();
		
		long time_final = (new Date()).getTime();
		long duracao = time_final - time_inicial;
		
		infoUrl.setTemp_resp(duracao);	
 
		if(status == null)
		{
			return false;
		}
		else
		{
			return status.contains("OK");
		}
	}

	@Asynchronous
	@PostConstruct
	@Schedule(dayOfMonth="*", hour="*", minute="*", second="0, 15, 30, 45")
	public void run()
	{	
		while(true)
		{
			System.out.println(" ...RODANDO... " + (cont++));
			
			List<Sistema> sistemasBD = new ArrayList<Sistema>();
			List<Url> urlsBD = new ArrayList<Url>();
			
			sistemasBD = sistemaEJB.buscaSistemaVerificarTrue();
			if(sistemasBD!=null)
			{
				for(Sistema sistema: sistemasBD)
				{
					if(sistema.isVerificar()==true)
					{
						urlsBD = urlEJB.procuraUrlsSistema(sistema.getId());
						
						for(Url x: urlsBD)
						{							
							x = testaUrl(x);							
						}
						for(Url x: urlsBD)
						{
							if(x.isDisponivel()==false)
							{
								sistema.setDisponivel(false);
								sistemaEJB.atualizaSistema(sistema);
								break;
							}
							else
							{
								sistema.setDisponivel(true);
								sistemaEJB.atualizaSistema(sistema);
							}
						}
						
						urlsBD = new ArrayList<Url>();
					}
				}
				
				break;
			}
		}	
	}
	
	public Url testaUrl(Url url)
	{
		infoUrl.setUrl(url);
		
		try
		{
			if(isOnline(url.getNomeUrl()))
			{
				infoUrl.setDisponivel(true);
				url.setDisponivel(true);
			}
			else
			{
				infoUrl.setDisponivel(false);
				url.setDisponivel(false);
				
				Date date = new Date();
				
				url.setDataAtual(date);
				
				controleDeQuedas = controleDeQuedasEJB.buscaPorData(url.getDataAtual(), url);

				if (controleDeQuedas==null)
				{
					controleDeQuedas = new ControleDeQuedas();
					
					controleDeQuedas.setUrl(url);
					controleDeQuedas.setData(url.getDataAtual());
					controleDeQuedas.setTotalQuedas(1);
					
					controleDeQuedasEJB.insereControleDeQuedas(controleDeQuedas);
				}
				else
				{
					controleDeQuedas.setUrl(url);
					controleDeQuedas.setData(url.getDataAtual());
					controleDeQuedas.setTotalQuedas(controleDeQuedas.getTotalQuedas() + 1);
					
					controleDeQuedasEJB.atualizaControleDeQuedas(controleDeQuedas);					
				}
			}
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
		
		urlEJB.atualizaUrl(url);
		infoUrlEJB.insereInfoUrl(infoUrl);
		infoUrl = new InfoUrl();
		
		return url;
	}
	
	public InfoUrlEJB getInfoUrlEJB()
	{
		return infoUrlEJB;
	}
	public void setInfoUrlEJB(InfoUrlEJB infoUrlEJB)
	{
		this.infoUrlEJB = infoUrlEJB;
	}
}